#include <iostream>
#include <string>

using namespace std;

/*
虚函数
    基类中的成员函数 加了 virtual 标识符 表示这个成员函数已经成为了虚函数

    此时 子类是可以重写父类的虚函数

    Qt 绘图

    重写 
        printf
        画笔

什么是重写
    当父类中有虚函数 
    子类可以对这个虚函数进行重写
        重写 就是用 虚函数 的 返回值 函数名 参数列表 这些信息 重新在子类中编写了一个成员函数

    此时子类的重写函数 会覆盖基类


    printf
        输出到终端



纯虚函数 在函数后 加了一个 = 0
    virtual void Moto_start() = 0;

    纯虚函数 只能被声明 如果要使用纯虚函数 则必须重写

**抽象类**：当我们的类中，有一个纯虚函数后，那么现在这个类也就被称为了抽象类。

**特点**：

    > 1、抽象类无法实例化对象
    >
    > 2、抽象类的子类必须重写抽象类的纯虚函数，否则也属于抽象类
    >
    > 3、在函数的形参中 ， 还是可以用 抽象类作为 引用参数
*/

class Motor_Ctrl
{

public:
    // 电机启动函数
    // 虚函数  : 可以被重写
    virtual void Moto_start() = 0 ;

    // 电机停止函数
    virtual void Moto_stop() = 0; // 虚函数
};

class Motor_x : public Motor_Ctrl
{
private:
    /* data */
public:
    // 电机启动函数
    void Moto_start()
    {
        cout << "派生类电机启动" << endl;
    }
    // 电机停止函数
    void Moto_stop()
    {
        cout << "派生类电机停止" << endl;
    }
};




/*
父类可以作为子类的类型
子类不能作为父类的类型
*/
void Motor_func(Motor_Ctrl & M)
{
    M.Moto_start();
    M.Moto_stop();
}


int main(int argc, char const *argv[])
{
    Motor_x M;
    Motor_func(M);

    return 0;
}
